package Queue;

public class CircleSqQueue implements IQueue{
    // 循环队列
    // 解决顺序队列多次操作后 假溢出的现象问题
    // 其中 存储空间为 最大长度减一

    // 队列的存储空间
    private Object[] queueElem;
    // 指向队首元素
    private int front;
    // 指向队尾元素
    private int rear;
    // 队列的最大的存储单元个数
    private int maxSize;

    public CircleSqQueue(int maxSize) {
        front = rear = 0;
        queueElem = new Object[maxSize];
        this.maxSize = maxSize;
    }

    // 将队列置为空
    public void clear() {
        front = rear = 0;
    }

    // 判断是否为空
    public boolean isEmpty() {
        return front == rear;
    }

    // 返回队列的长度
    public int length() {
        // 如果 队首大于队尾时 例如 总长为5 对尾索引在3 队首索引在4  真实长度应该是 4
        return (rear-front+maxSize)%maxSize;
    }

    // 读取对手元素并且返回其值
    public Object peek() {
        if(isEmpty()){
            return null;
        }else {
            return queueElem[front];
        }
    }

    // 入队  判断是否满   例如 总长为5 对尾索引在3 队首索引在4  所以满足栈满的条件
    public void offer(Object x) throws Exception {
        if((rear+1)%maxSize == front){
            throw new Exception("这个栈已经满了");
        }else {
            queueElem[rear] = x;
            rear = (rear+1)%maxSize;
        }
    }

    // 出队
    public Object poll() {
        if(isEmpty()){
            return null;
        }else {
            Object b = queueElem[front];
            front = (front+1)%maxSize;
            return b;
        }
    }

    // 展示队列
    public void display() {
        if(isEmpty()){
            System.out.println("此队列为空");
        }else {
            for(int i=front; i<rear; i=(i+1)%maxSize){
                System.out.println(queueElem[i]+" ");
            }
        }

    }
}


